package src.G_E_AnnotationAndReflection;

import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
import java.util.Map;

// 使用反射获取类信息（泛型）
public class G02_ReflectionTest04_2 {
    // 参数泛型
    public void test01(Map<String, User> map, List<User> list) {
        System.out.println("test01");
    }

    // 返回值泛型
    public Map<String, User> test02() {
        System.out.println("test02");
        return null;
    }

    public static void main(String[] args) throws Exception {
        // 获得Class对象
        Class c1 = G02_ReflectionTest04_2.class;
        // 获得方法test01
        Method test01 = c1.getMethod("test01", Map.class, List.class);
        // 获得参数类型
        for (Type genericParameterType : test01.getGenericParameterTypes()) {
            System.out.println("参数类型：" + genericParameterType);
            // 属于参数化类型，就可以获得真实类型（结构化参数类型）
            if (genericParameterType instanceof ParameterizedType) {
                // 获得泛型参数类型
                for (Type actualTypeArgument : ((ParameterizedType) genericParameterType).getActualTypeArguments()) {
                    System.out.println("真实类型:" + actualTypeArgument);
                }
            }
        }
        System.out.println();
        // 获得方法test02
        Method test02 = c1.getMethod("test02", null);
        // 获得返回值类型
        Type genericReturnType = test02.getGenericReturnType();
        System.out.println("返回值类型：" + genericReturnType);
        // 属于参数化类型，就可以获得真实类型（结构化参数类型）
        if (genericReturnType instanceof ParameterizedType) {
            // 获得泛型参数类型
            for (Type actualTypeArgument : ((ParameterizedType) genericReturnType).getActualTypeArguments()) {
                System.out.println("真实类型:" + actualTypeArgument);
            }
        }
    }
}
